package com.itheima.reggie.controller;

import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    // 动态配置文件中的地址
    @Value("${reggie.path}")
    private String basePath;

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
        log.info(file.getName());

        //1、判断basePath,new File获取文件目录地址
        File dir = new File(basePath);
        //调用exists方法判断 文件夹是否存在
        if (!dir.exists()){
            //如果文件夹不存在，则创建文件夹，调用mkdirs 创建多级目录
            dir.mkdirs(); // 创建目录
        }

        //获取原始文件名  调用getOriginalFilename方法
        String originalFilename = file.getOriginalFilename();

        // 动态获取文件名后缀名称 (.jpg )  先调用substring方法获取文件名后缀，然后再调用lastIndexOf 以最后一个 . 开始往后切割
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //防止文件名重复 造成文件覆盖 建议使用uuid随机生成文件名称
        String fileName = UUID.randomUUID() + suffix;


        //将临时文件转存到指定位置调用transferTo方法 然后new 一个文件地址
        try {
            file.transferTo(new File(basePath + fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 响应文件名给前端
        return R.success(fileName);
    }

    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws Exception{

        //1、输入流 ： 读文件   basePath:地址  name ： 图片的文件名称   地址+名称  找到这个图片（吧图片上传到服务器）
        FileInputStream is = new FileInputStream(basePath + name);

        //2、输出流 ： 写文件   将图片下载下来最后响应给客户端
        ServletOutputStream os = response.getOutputStream();

        //3、输入流和输出流对接
        IOUtils.copy(is,os);
        is.close();


    }

}
